package db

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"k8s-platform/config"
	"log"
)

var (
	isInit bool
	GORM *gorm.DB
	err error
)

//数据库初始化
func Init()  {
	//fmt.Println(config.DBuser,config.DBpasswd,config.DBHost,config.DBPort,config.DBName,config.LogMod,"----------------------------")
	//判断是否已经初始化
	if isInit {
		return
	}
	//组装连接配置
	dsn := fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.DBuser,config.DBpasswd,config.DBHost,config.DBPort,config.DBName)
	GORM, err = gorm.Open("mysql",dsn)
	if err != nil {
		panic("数据库连接失败" + err.Error())
	}

	//打印sql语句
	GORM.LogMode(config.LogMod)

	//开启连接池
	//#最大空闲连接
	GORM.DB().SetMaxIdleConns(10)
	//最大连接数
	GORM.DB().SetMaxOpenConns(100)
	//连接可复用的最大时间
	GORM.DB().SetConnMaxLifetime(30)

	/*
	SetMaxOpenConns
	默认情况下，连接池的最大数星是没有限制的。一般来说，连接数越多，访问数据库的性能越高。但是系统资源不是无限的，数据库的并发能力也不是无限的。因此为了减少系统和数据库崩溃的风险，可以给并发连接数设置一个上限，这个数值一般不超过进程的最大文件句柄打开数，不超过数据库服务自身支持的并发连接数，比如1000。
	SetMaxldleConns
	理论上maxldleConns连接的上限越高，也即允许在连接池中的空闲连接最大值越大，可以有效减少连接创建和销毁的次数，提高程序的性能。但是连接对象也是占用内存资源的，而且如果空闲连接越多，存在于连接池内的时间可能越长。连接在经过一段时间后有可能会变得不可用，而这时连接还在连接池内没有回收的话，后续被征用的时候就会出问题。一般建议maxldleconns的值为MaxOpenConns的1/2 ,仅供参考。
	SetConnMaxLifetime
	设置一个连接被使用的最长时间，即过了一段时间后会被强制回收，理论上这可以有效减少不可用连接出现的概率。当数据库方面也设置了连接的超时时间时，这个值应当不超过数据库的超时参数值。
	*/

	isInit = true
	log.Println("数据库初始化成功！")
}

func Close() error {
	return GORM.Close()
}